package com.ruoyi.system.service.impl;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.system.dao.SysRoleOrgDAO;
import com.ruoyi.system.domain.SysRoleOrg;
import com.ruoyi.system.service.ISysRoleOrgService;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.domain.Specification;
import org.springframework.transaction.annotation.Transactional;

import javax.persistence.criteria.Predicate;

/**
 * 角色与组织关系信息Service业务层处理
 *
 * @author youde
 * @date 2022-11-16
 */
@Service
public class SysRoleOrgServiceImpl implements ISysRoleOrgService {
    @Autowired
    private SysRoleOrgDAO sysRoleOrgDAO;


    /**
     * 查询角色与组织关系信息
     *
     * @param roleOrgId 角色与组织关系信息主键
     * @return 角色与组织关系信息
     */
    @Override
    public SysRoleOrg selectSysRoleOrgByRoleOrgId(String roleOrgId) {
        return sysRoleOrgDAO.findById(roleOrgId).orElse(null);
    }

    /**
     * 查询角色与组织关系信息列表
     *
     * @param sysRoleOrg 角色与组织关系信息
     * @return 角色与组织关系信息
     */
    @Override
    public Page<SysRoleOrg> selectSysRoleOrgList(SysRoleOrg sysRoleOrg, Pageable pageinfo) {
        return sysRoleOrgDAO.findAll(getSpecification(sysRoleOrg), pageinfo);
    }

    /**
     * 查询角色与组织关系信息列表
     *
     * @param sysRoleOrg 角色与组织关系信息
     * @return 角色与组织关系信息
     */
    @Override
    public List<SysRoleOrg> selectSysRoleOrgList(SysRoleOrg sysRoleOrg) {
        return sysRoleOrgDAO.findAll(getSpecification(sysRoleOrg));
    }


    private Specification<SysRoleOrg> getSpecification(SysRoleOrg sysRoleOrg) {
        return (root, criteriaQuery, criteriaBuilder) -> {
            List<Predicate> predicateList = new ArrayList<>();

            if (!StringUtils.isEmpty(sysRoleOrg.getRoleOrgId())) {
                predicateList.add(criteriaBuilder.equal(root.get("roleOrgId"), sysRoleOrg.getRoleOrgId()));
            }
            if (!StringUtils.isNull(sysRoleOrg.getRoleId())) {
                predicateList.add(criteriaBuilder.equal(root.get("roleId"), sysRoleOrg.getRoleId()));
            }
            if (!StringUtils.isEmpty(sysRoleOrg.getOrgId())) {
                predicateList.add(criteriaBuilder.equal(root.get("orgId"), sysRoleOrg.getOrgId()));
            }
            if (!StringUtils.isEmpty(sysRoleOrg.getOrgType())) {
                predicateList.add(criteriaBuilder.equal(root.get("orgType"), sysRoleOrg.getOrgType()));
            }
            if (!StringUtils.isEmpty(sysRoleOrg.getCreateBy())) {
                predicateList.add(criteriaBuilder.equal(root.get("createBy"), sysRoleOrg.getCreateBy()));
            }
            if (!StringUtils.isNull(sysRoleOrg.getCreateTime())) {
                predicateList.add(criteriaBuilder.equal(root.get("createTime"), sysRoleOrg.getCreateTime()));
            }
            if (!StringUtils.isEmpty(sysRoleOrg.getUpdateBy())) {
                predicateList.add(criteriaBuilder.equal(root.get("updateBy"), sysRoleOrg.getUpdateBy()));
            }
            if (!StringUtils.isNull(sysRoleOrg.getUpdateTime())) {
                predicateList.add(criteriaBuilder.equal(root.get("updateTime"), sysRoleOrg.getUpdateTime()));
            }
            if (!StringUtils.isEmpty(sysRoleOrg.getRemark())) {
                predicateList.add(criteriaBuilder.equal(root.get("remark"), sysRoleOrg.getRemark()));
            }
            Predicate[] p = new Predicate[predicateList.size()];
            return criteriaBuilder.and(predicateList.toArray(p));
        };

    }

    /**
     * 新增角色与组织关系信息
     *
     * @param sysRoleOrg 角色与组织关系信息
     * @return 结果
     */
    @Transactional
    @Override
    public SysRoleOrg[] insertSysRoleOrg(SysRoleOrg[] sysRoleOrg) {
        if(StringUtils.isNotEmpty(sysRoleOrg)){
            sysRoleOrgDAO.deleteByRoleId(sysRoleOrg[0].getRoleId());
            return sysRoleOrgDAO.saveAll(Arrays.asList(sysRoleOrg)).toArray(new SysRoleOrg[0]);
        }

        return null;

    }

    /**
     * 修改角色与组织关系信息
     *
     * @param sysRoleOrg 角色与组织关系信息
     * @return 结果
     */
    @Override
    public SysRoleOrg updateSysRoleOrg(SysRoleOrg sysRoleOrg) {
        return sysRoleOrgDAO.save(sysRoleOrg);
    }

    /**
     * 批量删除角色与组织关系信息
     *
     * @param roleOrgIds 需要删除的角色与组织关系信息主键
     * @return 结果
     */
    @Override
    public void deleteSysRoleOrgByRoleOrgIds(String[] roleOrgIds) {
        sysRoleOrgDAO.deleteAllById(Arrays.asList(roleOrgIds));
    }

    /**
     * 删除角色与组织关系信息信息
     *
     * @param roleOrgId 角色与组织关系信息主键
     * @return 结果
     */
    @Override
    public void deleteSysRoleOrgByRoleOrgId(String roleOrgId) {
        sysRoleOrgDAO.deleteById(roleOrgId);
    }

    /**
     * 根据角色id查询关系的组织信息
     *
     * @param roleId
     * @return
     */
    @Override
    public List<SysRoleOrg> findByRoleId(String roleId) {
        return sysRoleOrgDAO.findByRoleId(roleId);
    }

    /**
     * 根据角色id删除分配的组织信息
     *
     * @param roleId
     * @return
     */
    @Override
    public int deleteByRoleId(String roleId) {
        return sysRoleOrgDAO.deleteByRoleId(roleId);
    }
}